package com.heima.admin.test;

import com.heima.utils.common.BCrypt;
import org.apache.commons.lang.RandomStringUtils;
import org.junit.Test;
import org.springframework.util.DigestUtils;

/**
 *  可逆加密算法: 对称
 *                  AES、DES、3DES、Blowfish、IDEA、RC4、RC5、RC6、HS256
 *              非对称(私钥 公钥)
 *                  RSA、DSA（数字签名用）、ECC（移动设备用）、RS256 (采用SHA-256 的 RSA 签名)
 *  不可逆加密算法:
 *              种类:  Hash加密算法, 散列算法, 摘要算法等
 *              MD5:  散列--> 每次加密都是一样的,可以撞出原文
 *             手动加密: md5+salt(随机字符串)
 *             BCrypt: BCrypt不支持反运算，只支持密码校验
 *
 */
public class Encrypt {

    /**
     * MD5直接加密(不可逆)
     */
    @Test
    public void testMD5() {
        for (int i = 0; i < 10; i++) {
            String pwd = "123456";
            String pwdEncrypt = DigestUtils.md5DigestAsHex(pwd.getBytes());
            System.out.println("MD5加密后的密码: " + pwdEncrypt);
        }
    }

    /**
     * MD5 加盐加密(不可逆)
     */
    @Test
    public void testMD5Salt() {
        for (int i = 0; i < 10; i++) {
            String pwd = "123456";
            //获取随机数
            String salt = RandomStringUtils.randomAlphabetic(10);
            pwd = pwd + salt;

            String pwdEncrypt = DigestUtils.md5DigestAsHex(pwd.getBytes());
            System.out.println("salt: " + salt);
            System.out.println("MD5加密后的密码: " + pwdEncrypt);
        }
    }

    /**
     * BCrypt 不可逆加密
     * 用户注册时,对密码进行加密
     */
    @Test
    public void testBCrypt() {
        for (int i = 0; i < 10; i++) {
            String pwd = "123456";
            //自动获取salt
            String salt = BCrypt.gensalt();
            //加密
            String pwdEncrypt = BCrypt.hashpw(pwd, salt);

            System.out.println("salt: " + salt);
            System.out.println("BCrypt加密后的密码: " + pwdEncrypt);
        }
    }

    /**
     * BCrypt 不可逆加密,校验
     */
    @Test
    public void testBCryptCheck() {
        //明文密码
        String pwd = "123456";
        //密文密码
        String pwdEncrypt = "$2a$10$3x0Qt7XRPVM71vYWOjGFR.gS9rCmOYzfmY64S8IWCZqEB.AMg7p4a";
        boolean checkpw = BCrypt.checkpw(pwd, pwdEncrypt);

        System.out.println(checkpw);
    }

}
